
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2010, Adam Kubach
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Class to manage the active path.
//
///////////////////////////////////////////////////////////////////////////////

#include "Minerva/Document/CameraPathController.h"

#include "Usul/Functions/SafeCall.h"

#include "boost/bind.hpp"

using namespace Minerva::Document;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

CameraPathController::CameraPathController() : BaseClass(),
  _currentPath ( 0x0 )
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

CameraPathController::~CameraPathController()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the current path.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentPath ( CameraPath::RefPtr path )
{
  _currentPath = path;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the current path.
//
///////////////////////////////////////////////////////////////////////////////

CameraPath::RefPtr CameraPathController::currentPath() const
{
  return _currentPath;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Append current camera.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentCameraAppend ( CameraState::RefPtr camera )
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;

  // Use helper function.
  callCameraFunction ( boost::bind ( &CameraPath::append, _currentPath.get(), _1, _2, _3 ), camera );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Prepend current camera.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentCameraPrepend ( CameraState::RefPtr camera )
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;

  // Use helper function.
  callCameraFunction ( boost::bind ( &CameraPath::prepend, _currentPath.get(), _1, _2, _3 ), camera );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Insert between two nearest cameras.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentCameraInsert ( CameraState::RefPtr camera )
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;

  // Use helper function.
  callCameraFunction ( boost::bind ( &CameraPath::insertBetweenNearest, _currentPath.get(), _1, _2, _3 ), camera );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Remove the nearest camera.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentCameraRemove ( CameraState::RefPtr camera )
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;

  // Use helper function.
  callCameraFunction ( boost::bind ( &CameraPath::removeNearest, _currentPath.get(), _1, _2, _3 ), camera );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Replace the nearest camera.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::currentCameraReplace ( CameraState::RefPtr camera )
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;

  // Use helper function.
  callCameraFunction ( boost::bind ( &CameraPath::replaceNearest, _currentPath.get(), _1, _2, _3 ), camera );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Close the path.
//
///////////////////////////////////////////////////////////////////////////////

void CameraPathController::closePath()
{
  // Handle no path.
  if ( false == _currentPath.valid() )
    return;
  
  _currentPath->closePath();
}
